package com.yanze.customviewdemo

import android.content.Context
import android.content.Intent
import android.graphics.Bitmap
import android.graphics.BitmapFactory
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import android.widget.ImageView
import kotlinx.coroutines.*
import java.io.InputStream
import java.net.HttpURLConnection
import java.net.URL

class KotlinActivity : AppCompatActivity() {

    val imgUrl = "https://palmap-source.oss-cn-shanghai.aliyuncs.com/bigscreen-buid-data/banner/banndr_4.jpg"
    private lateinit var iv_test: ImageView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_kotlin)
        iv_test = findViewById<ImageView>(R.id.iv_test)

        CoroutineScope(Dispatchers.Main).launch {
            Log.i("yanze", "当前线程1：${Thread.currentThread().name}")
            val bitmap = withContext(Dispatchers.IO) {
                Log.i("yanze", "当前线程2：${Thread.currentThread().name}")
                getImage(imgUrl)
            }

            iv_test.setImageBitmap(bitmap)
        }
    }

    fun getConfig() {
        //方式一：使用 runBlocking 顶层函数
        //适用于单元测试的场景，而业务开发中不会用到这种方法，因为它是线程阻塞的。
        runBlocking {
        }

        //方式二：使用 GlobalScope 单例对象 可以直接调用 launch 开启协程
        //和使用 runBlocking 的区别在于不会阻塞线程。但在 Android 开发中同样不推荐这种用法，因为它的生命周期会和 app 一致，且不能取消
        GlobalScope.launch {
        }

        //方式三：自行通过 CoroutineContext 创建一个 CoroutineScope 对象
        //比较推荐的使用方法，可以通过 context 参数去管理和控制协程的生命周期
        CoroutineScope(Dispatchers.Main).launch {
        }
    }

    fun getImage(url: String): Bitmap {
        val urlParam = URL(url)
        val openConnection = urlParam.openConnection() as HttpURLConnection
        openConnection.requestMethod = "GET"
        openConnection.connect()
        val inputStream: InputStream = openConnection.inputStream
        return BitmapFactory.decodeStream(inputStream)
    }

    companion object {
        fun start(context:Context) {
            var intent = Intent(context,KotlinActivity::class.java)
            context.startActivity(intent)
        }
    }
}
